from http import HTTPStatus

from flask import Flask, jsonify, request

from database import (
    create_user,
    get_all_coffee_json,
    get_all_users_json,
    get_unique_notes,
    initialize_db,
)

app = Flask(__name__)


@app.before_request
def setup():
    initialize_db()


@app.route("/users/", methods=["GET"])
def get_all_users_route():
    """Получить список всех пользователей.

    С параметром сountry возвращает пользователей с идентичным названием страны в адресе.

    Examples:
        curl http://127.0.0.1:8000/users/ | jq
        curl "http://127.0.0.1:8000/users/?country=Moldova" | jq
    """
    country = request.args.get("country", None)
    users = get_all_users_json(country)
    return jsonify(users), HTTPStatus.OK


@app.route("/users/", methods=["POST"])
def create_new_user_route():
    """Создать нового пользователя с именем name (обязательно), любимым кофе с указанным id и адресом.

    Возвращает полное инфо о созданном пользователе, в том числе подгружает полную инфу о любимом кофе.

    Examples:
        curl -X POST -H "Content-Type: application/json" \
            --data '{"name": "Flying Lotus", "coffee_id": 1, "address": {"country": "America"}}' \
             http://127.0.0.1:8000/users/
    """
    name = request.json.get("name", None)
    coffee_id = request.json.get("coffee_id", None)
    address = request.json.get("address", None)

    if not name:
        return jsonify({"message": "Name must be specfied"}), HTTPStatus.BAD_REQUEST

    user = create_user(name, coffee_id, address)

    return jsonify(user), HTTPStatus.OK


@app.route("/coffee/", methods=["GET"])
def get_all_coffee_route():
    """Получить список всех сортов кофе.

    С параметром title осуществляет полнотекстовый поиск по названию по переданному значению.

    Examples:
        curl http://127.0.0.1:8000/coffee/ | jq
        curl "http://127.0.0.1:8000/coffee/?title=Forrester" | jq
    """
    title = request.args.get("title", None)
    coffee = get_all_coffee_json(title)
    return jsonify(coffee), HTTPStatus.OK


@app.route("/notes/", methods=["GET"])
def get_all_unique_notes_route():
    """Возвращает список уникальных элементов в заметках к кофе.

    Example:
        curl http://127.0.0.1:8000/notes/ | jq
    """
    notes = get_unique_notes()
    return jsonify(notes), HTTPStatus.OK


if __name__ == "__main__":
    initialize_db()
    app.run(debug=True, host="0.0.0.0", port=8000)
